package com.ruoyi.combat.service.equiplocation.impl;

import com.ruoyi.combat.domain.equiplocation.CombatEquipInfo;
import com.ruoyi.combat.domain.equiplocation.CombatEquipRepositingTask;
import com.ruoyi.combat.domain.equiplocation.CombatEquipTask;
import com.ruoyi.combat.mapper.equiplocation.CombatEquipInfoMapper;
import com.ruoyi.combat.mapper.equiplocation.CombatEquipRepositingTaskMapper;
import com.ruoyi.combat.mapper.equiplocation.CombatEquipTaskMapper;
import com.ruoyi.combat.service.equiplocation.ICombatEquipInfoRepositingTaskService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.text.DecimalFormat;
import java.util.Date;
import java.util.List;

@Service
public class CombatEquipInfoRepositingTaskServiceImpl implements ICombatEquipInfoRepositingTaskService {

    @Autowired
    private CombatEquipRepositingTaskMapper combatEquipRepositingTaskMapper;
    @Autowired
    private CombatEquipInfoMapper combatEquipInfoMapper;
    @Autowired
    private CombatEquipTaskMapper combatEquipTaskMapper;

    @Override
    public List<CombatEquipRepositingTask> selectCombatEquipRepositingTaskList(CombatEquipRepositingTask combatEquipRepositingTask) {
        List<CombatEquipRepositingTask> combatEquipRepositingTasks = combatEquipRepositingTaskMapper.selectCombatEquipRepositingTaskList(combatEquipRepositingTask);
        return combatEquipRepositingTasks;
    }

    @Override
    public CombatEquipRepositingTask selectCombatEquipRepositingTaskById(Long id) {
        CombatEquipRepositingTask combatEquipRepositingTask = combatEquipRepositingTaskMapper.selectCombatEquipRepositingTaskById(id);
        return combatEquipRepositingTask;
    }

    @Override
    public int insertCombatEquipRepositingTask(CombatEquipRepositingTask combatEquipRepositingTask) {
        int i = combatEquipRepositingTaskMapper.insertCombatEquipRepositingTask(combatEquipRepositingTask);
        return i;
    }

    @Override
    public int updateCombatEquipRepositingTask(CombatEquipRepositingTask combatEquipRepositingTask) {
        int i = combatEquipRepositingTaskMapper.updateCombatEquipRepositingTask(combatEquipRepositingTask);
        return i;
    }

    @Override
    public int deleteCombatEquipRepositingTaskById(Long id) {
        int i = combatEquipRepositingTaskMapper.deleteCombatEquipRepositingTaskById(id);
        return i;
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public int callback(CombatEquipRepositingTask combatEquipRepositingTask) {
        Long id = combatEquipRepositingTask.getId();
        CombatEquipRepositingTask task = combatEquipRepositingTaskMapper.selectCombatEquipRepositingTaskById(id);
        if (task != null) {
            String afterLat = combatEquipRepositingTask.getAfterLat();
            String afterLon = combatEquipRepositingTask.getAfterLon();
            String afterDistance = combatEquipRepositingTask.getAfterDistance();
            task.setAfterLat(afterLat);
            task.setAfterLon(afterLon);
            // afterDistance 保留两位小数
            afterDistance = new DecimalFormat("#.00").format(Double.parseDouble(afterDistance));
            task.setAfterDistance(afterDistance);
            task.setEndtime(new Date());
            task.setTaskState("2");
            combatEquipRepositingTaskMapper.updateCombatEquipRepositingTask(task);
            // 根据目标IP查询设备信息
            CombatEquipInfo combatEquipInfo = combatEquipInfoMapper.selectCombatEquipInfoByIp(task.getProtectedIp());
            // 判断设备抗定位是否已完成，如果已完成，则认为是抗定位操作，如果是未完成，则认为是重定位操作
            if ("2".equals(combatEquipInfo.getRiskMark())) {
                // 设置抗定位后的风险距离
                combatEquipInfo.setAfterRiskDistance(new DecimalFormat("#.00").format(Double.parseDouble(task.getAfterDistance())));
                combatEquipInfo.setAfterEquipRiskLat(task.getAfterLat());
                combatEquipInfo.setAfterEquipRiskLon(task.getAfterLon());
                double riskDistance = Double.parseDouble(combatEquipInfo.getAfterRiskDistance());
                if (riskDistance < 10) {
                    combatEquipInfo.setAfterRiskLevel("3");
                } else if (riskDistance >= 10 && riskDistance < 30) {
                    combatEquipInfo.setAfterRiskLevel("2");
                } else {
                    combatEquipInfo.setAfterRiskLevel("1");
                }

                // 查询当前设备的最新的所有的基于时延的抗定位任务信息
                CombatEquipTask combatEquipTask = new CombatEquipTask();
                combatEquipTask.setEquipIp(combatEquipInfo.getEquipIp());
                combatEquipTask.setTaskMethod("2");
                combatEquipTask.setTaskState("1");
                List<CombatEquipTask> combatEquipTasks = combatEquipTaskMapper.selectCombatEquipTaskList(combatEquipTask);
                if (combatEquipTasks != null && combatEquipTasks.size() > 0) {
                    for (CombatEquipTask equipTask : combatEquipTasks) {
                        equipTask.setTaskState("2");
                        equipTask.setEndtime(new Date());
                        equipTask.setAfterRiskDistance(new DecimalFormat("#.00").format(Double.parseDouble(task.getAfterDistance())));
                        combatEquipTaskMapper.updateCombatEquipTask(equipTask);
                    }
                }
            } else {
                combatEquipInfo.setBeforeEquipRiskLat(task.getAfterLat());
                combatEquipInfo.setBeforeEquipRiskLon(task.getAfterLon());
                // task.getAfterDistance() 保留两位小数
                combatEquipInfo.setBeforeRiskDistance(new DecimalFormat("#.00").format(Double.parseDouble(task.getAfterDistance())));
                double riskDistance = Double.parseDouble(combatEquipInfo.getBeforeRiskDistance());
                if (riskDistance < 10) {
                    combatEquipInfo.setRiskLevel("3");
                } else if (riskDistance >= 10 && riskDistance < 30) {
                    combatEquipInfo.setRiskLevel("2");
                } else {
                    combatEquipInfo.setRiskLevel("1");
                }
            }
            combatEquipInfoMapper.updateCombatEquipInfo(combatEquipInfo);
        }
        return 1;
    }
}
